// 0、1、...、n-1这n个数字排成一个圆圈，从数字0开始，每次从圆圈里删除第m个数字，现在给定整数n和m
// 要求：求出这个圆圈中剩下的最后一个数字

// 解题思路：每隔m个数就要删除一个数，那么被删除的这个数的下一个数就会称为新的起点，就相当于数组进行左移m位，
// 反过来思考的话，从最后一步向前推，则每一步都向右移动了m位（包括胜利者）
// f(n,m) = f(n-1, m) + m
// 当前数组右移超过数组容量的部分应该重新放到数组头部位置，所以公式应该为：f(n, m) = (f(n-1, m) + m) % n
// https://leetcode.cn/problems/find-the-winner-of-the-circular-game/solutions/1467699/by-fuxuemingzhu-laof/
// 如果从下向上反推的时候：假如它下一轮的下标为 pos，那么当前轮次的下标就是： (pos+m)% 当前轮次的人数
// 函数 f(n,m) ：表示对 n 个数字 0,1,…,n−1  做约瑟夫环操作，最后剩下的这个数字。
function lastRemaining(n, m) {
    let ans = 0
    for (let i = 2; i <= n; i++) {
        ans = (ans + m) % i        
    }
    return ans
}
let n = 5, m = 3
console.log(lastRemaining(n, m))
// 0,1,2,3,4,5